home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 11 / AMUG BBS in a Box Volume XI (April 1994) (MacWizards).iso / Files / Prog / T / ThinkHelper 1.0b1.sit / ThinkHelper 1.0b1 / Source (!) / Source / ThinkHelperPatch.c / ThinkHelperPatch.c
Encoding:
C/C++ Source or Header  |  1993-08-19  |  7.5 KB  |  364 lines  |  [TEXT/KAHL]

  1. /*
  2.     ThinkHelpPatch.c
  3.     
  4.     code for the think helper patch
  5.     
  6.     © 1993 Steve Zellers
  7.     
  8.     <revision history>
  9.     05/15/93  smz  created
  10.     05/20/93  smz  generalized dispatches, added grep
  11.     08/18/93  smz  first beta
  12. */
  13.  
  14. #include <SetUpA4.h>
  15. #include <AppleEvents.h>
  16. #include "ThinkHelpPatch.h"
  17. #include "Exceptions.h"
  18. #include "PUFInterface.h"
  19. #include "ListTools.h"
  20. #include <GestaltEQU.h>
  21.  
  22. typedef pascal OSErr (*AEHandlerProc)(AppleEvent* event, AppleEvent* reply);
  23.  
  24. static pascal OSErr _AEHandlerProc(AppleEvent* event, AppleEvent* reply, long refcon)
  25. {
  26.     OSErr err;
  27.     AEHandlerProc pPtr = (AEHandlerProc) refcon;
  28.     
  29.     SetUpA4();
  30.  
  31.     try {
  32.         err = (*pPtr) (event, reply);
  33.     } catch {
  34.         err = theException;
  35.     }
  36.  
  37.     // handle any special errors we have
  38.     switch (err) {
  39.         case corErr: {
  40.             static char cErrorString[] = "The target window isn't set up properly.";
  41.             AEDesc replyDesc;
  42.             OSErr replyErr;
  43.             
  44.             replyErr = AECreateDesc(typeChar, cErrorString, sizeof(cErrorString), &replyDesc);
  45.             FailErr(replyErr);
  46.             
  47.             if (replyErr == noErr) {
  48.                 replyErr = AEPutParamDesc(reply, keyErrorString, &replyDesc);
  49.                 AEDisposeDesc(&replyDesc);
  50.             }
  51.         }    break;
  52.             
  53.         default:
  54.             break;
  55.     }
  56.     
  57.     RestoreA4();
  58.  
  59.     return err;
  60. }
  61.  
  62. static pascal OSErr _HandleGetSelection(AppleEvent* event, AppleEvent* reply)
  63. {
  64.     OSErr err = noErr;
  65.     long selStart, selEnd;
  66.     
  67.     PUFGetSelection(&selStart, &selEnd);
  68.     
  69.     PutSelectionList(reply, selStart, selEnd);
  70.     
  71.     return err;
  72. }
  73.  
  74. static pascal OSErr _HandleSetSelection(AppleEvent* event, AppleEvent* reply)
  75. {
  76.     OSErr err = noErr;
  77.     AEDesc selList;
  78.     long selStart, selEnd;
  79.     long ctParams;
  80.     DescType actualtype;
  81.     long actualsize;
  82.     AEKeyword actualkeyword;
  83.  
  84.     err = AEGetKeyDesc(event, keyDirectObject, typeAEList, &selList);
  85.     FailErr(err);
  86.  
  87.     err = AECountItems(&selList, &ctParams);
  88.     FailErr(err);
  89.  
  90.     if (ctParams != 2)
  91.         throw(paramErr);
  92.  
  93.     err = AEGetNthPtr(
  94.         &selList, 1, typeLongInteger, &actualkeyword, &actualtype, 
  95.         (Ptr) &selStart, sizeof(selStart), &actualsize);
  96.     FailErr(err);
  97.  
  98.     err = AEGetNthPtr(
  99.         &selList, 2, typeLongInteger, &actualkeyword, &actualtype, 
  100.         (Ptr) &selEnd, sizeof(selEnd), &actualsize);
  101.     FailErr(err);
  102.  
  103.     PUFSetSelection(selStart, selEnd);
  104.  
  105.     return err;
  106. }
  107.  
  108. static pascal OSErr _HandleGetFileText(AppleEvent* event, AppleEvent* reply)
  109. {
  110.     OSErr err = noErr;
  111.     AEDesc desc;
  112.     Handle h = PUFGetText();
  113.     FailNil(h);
  114.  
  115.     desc.descriptorType = 'TEXT';
  116.     desc.dataHandle = h;
  117.     
  118.     err = AEPutParamDesc(reply, keyDirectObject, &desc);
  119.     AEDisposeDesc(&desc);
  120.     
  121.     return err;
  122. }
  123.  
  124. static pascal OSErr _HandleCopySelection(AppleEvent* event, AppleEvent* reply)
  125. {
  126.     OSErr err = noErr;
  127.     AEDesc desc;
  128.     Handle h = PUFCopySelection();
  129.     FailNil(h);
  130.  
  131.     desc.descriptorType = 'TEXT';
  132.     desc.dataHandle = h;
  133.     FailErr(err);
  134.  
  135.     err = AEPutParamDesc(reply, keyDirectObject, &desc);
  136.     AEDisposeDesc(&desc);
  137.  
  138.     return err;
  139. }
  140.  
  141. static void ExtractString(AppleEvent* event, Str255 string)
  142. {
  143.     AEDesc text;
  144.     short textLen;
  145.     OSErr err;
  146.     
  147.      // extract a string from the event
  148.     err = AEGetKeyDesc(event, keyDirectObject, typeChar, &text);
  149.     FailErr(err);
  150.     FailNil(text.dataHandle);
  151.  
  152.     textLen = GetHandleSize(text.dataHandle);
  153.     if (textLen > 254)
  154.         textLen = 254;
  155.     string[0] = textLen;
  156.     BlockMove(*text.dataHandle, &string[1], textLen);
  157.  
  158.     AEDisposeDesc(&text);
  159. }
  160.  
  161. static pascal OSErr _HandleGetMarker(AppleEvent* event, AppleEvent* reply)
  162. {
  163.     OSErr err;
  164.     Str255 markerString;
  165.     PUFMarker marker;
  166.     AEDesc markerList;
  167.     
  168.     ExtractString(event, markerString);
  169.     
  170.     // get the marker
  171.     PUFGetMarkerPos(markerString, &marker);
  172.  
  173.     // return the marker
  174.     MakeMarkerList(&marker, &markerList);
  175.  
  176.     err = AEPutParamDesc(reply, keyDirectObject, &markerList);
  177.     AEDisposeDesc(&markerList);
  178.  
  179.     return err;
  180. }
  181.  
  182. static pascal OSErr _HandleDeleteMarker(AppleEvent* event, AppleEvent* reply)
  183. {
  184.     OSErr err = noErr;
  185.     Str255 markerString;
  186.  
  187.     ExtractString(event, markerString);
  188.     
  189.     // delete it
  190.     PUFDeleteMarker(markerString);
  191.     
  192.     return err;
  193. }
  194.  
  195. static pascal OSErr _HandleMark(AppleEvent* event, AppleEvent* reply)
  196. {
  197.     OSErr err = noErr;
  198.     Str255 markerString;
  199.  
  200.     ExtractString(event, markerString);
  201.     
  202.     // delete it
  203.     PUFMarkSelection(markerString);
  204.     
  205.     return err;
  206. }
  207.  
  208. static pascal OSErr _HandleGetMarkers(AppleEvent* event, AppleEvent* reply)
  209. {
  210.     OSErr err;
  211.     AEDesc returnMarkerList;
  212.     long selStart, selEnd;
  213.     PUFMarker marker;
  214.     
  215.     err = AECreateList(nil, 0, false, &returnMarkerList);
  216.     FailErr(err);
  217.  
  218.     try {
  219.         short i;
  220.         for (i = 0; true;  i++) {
  221.             if (! PUFGetNthMarker(i, &marker))
  222.                 break;
  223.             PushMarker(&marker, &returnMarkerList);
  224.         }
  225.         err = AEPutParamDesc(reply, keyDirectObject, &returnMarkerList);
  226.         AEDisposeDesc(&returnMarkerList);
  227.     } catch {
  228.         AEDisposeDesc(&returnMarkerList);
  229.         throw(theException);
  230.     }
  231.     
  232.     return err;
  233. }
  234.  
  235. static pascal OSErr _HandleCallMenu(AppleEvent* event, AppleEvent* reply)
  236. {
  237.     OSErr err;
  238.     AEDesc textDesc;
  239.     Str255 s;
  240.  
  241.     // extract a string from the event
  242.     err = AEGetKeyDesc(event, keyDirectObject, typeChar, &textDesc);
  243.     FailErr(err);
  244.     FailNil(textDesc.dataHandle);
  245.  
  246.     s[0] = GetHandleSize(textDesc.dataHandle);
  247.     if (s[0] > 254)
  248.         s[0] = 254;
  249.     BlockMove(*textDesc.dataHandle, &s[1], s[0]);
  250.     AEDisposeDesc(&textDesc);
  251.  
  252.     PUFCallMenu(s);
  253.  
  254.     return noErr;
  255. }
  256.  
  257. static pascal OSErr _HandleGetFSSpec(AppleEvent* event, AppleEvent* reply)
  258. {
  259.     OSErr err = noErr;
  260.     AEDesc desc;
  261.     FSSpec spec;
  262.  
  263.     PUFGetFileSpec(&spec);
  264.  
  265.     err = AECreateDesc(typeFSS, (Ptr) &spec, sizeof(FSSpec), &desc);
  266.     FailErr(err);
  267.     
  268.     err = AEPutParamDesc(reply, keyDirectObject, &desc);
  269.     AEDisposeDesc(&desc);
  270.  
  271.     return err;
  272. }
  273.  
  274. static pascal OSErr _HandlePasteText(AppleEvent* event, AppleEvent* reply)
  275. {
  276.     OSErr err;
  277.     AEDesc textDesc;
  278.     
  279.     // extract a string from the event
  280.     err = AEGetKeyDesc(event, keyDirectObject, typeChar, &textDesc);
  281.     FailErr(err);
  282.     FailNil(textDesc.dataHandle);
  283.     
  284.     try {
  285.         PUFPasteText(textDesc.dataHandle);
  286.         AEDisposeDesc(&textDesc);
  287.     } catch {
  288.         AEDisposeDesc(&textDesc);
  289.         throw(theException);
  290.     }
  291.     
  292.     return noErr;
  293. }
  294.  
  295. static pascal OSErr _HandleMoveWin(AppleEvent* event, AppleEvent* reply)
  296. {
  297.     OSErr err;
  298.     DescType actualType;
  299.     Size actualSize;
  300.     Point pWhere, pSize;
  301.  
  302.     err = AEGetParamPtr(event, 'whre', 'QDpt', &actualType, (Ptr) &pWhere, sizeof(Point), &actualSize);
  303.     FailErr(err);
  304.     
  305.     err = AEGetParamPtr(event, 'size', 'QDpt', &actualType, (Ptr) &pSize, sizeof(Point), &actualSize);
  306.     FailErr(err);
  307.     
  308.     PUFZoomWindow(pWhere, pSize);
  309.  
  310.     return err;
  311. }
  312.     
  313. static pascal OSErr _HandleGetWinPos(AppleEvent* event, AppleEvent* reply)
  314. {
  315.     OSErr err;
  316.     WindowPtr w;
  317.     Rect r;
  318.     
  319.     w = FrontWindow();
  320.     if (w == nil)
  321.         throw(corErr);
  322.     
  323. //    r = w->portBits.bounds;
  324.     r = (**((WindowPeek) w)->strucRgn).rgnBBox;
  325.     err = AEPutParamPtr(reply, keyDirectObject, 'qdrt', (Ptr) &r, sizeof(Rect));
  326.     FailErr(err);
  327.  
  328.     return err;
  329. }
  330.     
  331. static void InstallHandler(OSType msg, AEHandlerProc proc)
  332. {
  333.     AEInstallEventHandler(cEventClass, msg, _AEHandlerProc, (long) proc, false);
  334. }
  335.  
  336. void main()
  337. {
  338.     long result;
  339.     
  340.     RememberA0();
  341.     SetUpA4();
  342.  
  343.     if (Gestalt(gestaltSystemVersion, &result) == noErr && result >= 0x0700) {
  344.         InstallHandler(cGetSelection, _HandleGetSelection);
  345.         InstallHandler(cSetSelection, _HandleSetSelection);
  346.         InstallHandler(cGetText, _HandleGetFileText);
  347.         InstallHandler(cCopySelection, _HandleCopySelection);
  348.         InstallHandler(cCallMenu, _HandleCallMenu);
  349.         InstallHandler(cGetWindowSpec, _HandleGetFSSpec);
  350.         InstallHandler(cMoveWindow, _HandleMoveWin);
  351.         InstallHandler(cGetWinPos, _HandleGetWinPos);
  352.         
  353.         InstallHandler(cGetMarker, _HandleGetMarker);
  354.         InstallHandler(cGetAllMarkers, _HandleGetMarkers);
  355.         InstallHandler(cDeleteMarker, _HandleDeleteMarker);
  356.         InstallHandler(cPasteText, _HandlePasteText);
  357.         InstallHandler(cMarkSelection, _HandleMark);
  358.  
  359.         InstallPUFPatches();
  360.     }
  361.     
  362.     RestoreA4();
  363. }
  364.